今天介紹對整個強化學習很重要的兩塊,視覺化方法跟資料前處理~前面如果有跑過unit3的朋友其實就有發現視覺化跟前處理的程式碼吧!他們的功能一個是讓訓練可視化與,另一個則有助於加快模型訓練。
這裡介紹或有點不直覺,但在Atari遊戲跟mujoco模擬來說,把資料放在視窗上呈現是件消耗的事情,尤其是mujoco這類需要用到3D渲染的技術。對於訓練看視窗或許是不必要的,只要使得它在底下能夠計算就行,但是因為這次我們是用selenium操控瀏覽器,所以基本上無須煩惱這塊,畫面的產生交給chrome就行,我們只需用javascript跟瀏覽器互動,並定時的擷取畫面。
對強化學習來說,從理解圖像內容,至從規則中找出最大化獎勵,是兩件事情。為了有效簡化模型負擔,我們會用些二值化的方法讓減輕模型負擔,另外用縮圖的方式減少計算資源消耗,畢竟其實在整個遊戲畫面上,空白畫面太多,重要的訊息就在於主角的位置、跟敵人的位置那幾個而已。
實現儲存資料,處理的資料包括:遊戲畫面、動作紀錄、獎勵值、是否中止、結束畫面、訓練回合、探索值(有多少機率不是採取max,而是隨機)
def save_obj(obj, name ): # 存物件方法
with open('objects/'+ name + '.pkl', 'wb') as f:
pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
def load_obj(name ): # 讀物件方法
with open('objects/' + name + '.pkl', 'rb') as f:
return pickle.load(f)
畫面擷取,執行javascript語法取圖像:
def grab_screen(_driver):
image_b64 = _driver.execute_script(getbase64Script)
screen = np.array(Image.open(BytesIO(base64.b64decode(image_b64))))
image = process_img(screen)#processing image as required
return image
前處理,畫面二值化與縮小:
def process_img(image):
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image[:300, :500] #Crop Region of Interest(ROI)
image = cv2.resize(image, (80,80))
return image
產生視窗,同時讓視窗具有迭代性值,可不斷傳入圖像進視窗:
def show_img(graphs = False):
while True:
screen = (yield)
window_title = "logs" if graphs else "game_play"
cv2.namedWindow(window_title, cv2.WINDOW_NORMAL)
imS = cv2.resize(screen, (800, 400))
cv2.imshow(window_title, screen)
if (cv2.waitKey(1) & 0xFF == ord('q')):
cv2.destroyAllWindows()
break
資料倉儲初始化,讓所有的訓練紀錄清空:
def init_cache():
save_obj(INITIAL_EPSILON,"epsilon")
t = 0
save_obj(t,"time")
D = deque() # 一種python的資料結構
save_obj(D,"D")
好哩今天介紹到這邊,下篇將介紹把重要的DQN模型拉~我們明天見囉~